package cn.dogeye.controller;

import cn.dogeye.common.consts.RedisKey;
import cn.dogeye.common.protocol.Result;
import cn.dogeye.entity.UserInfo;
import cn.dogeye.service.UserInfoService;
import cn.dogeye.util.RedisUtil;
import cn.hutool.core.lang.id.NanoId;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/regist")
public class RegisterController {
    @Autowired
    JavaMailSenderImpl javaMailSender;

    @Autowired
    RedisUtil redisUtil;

    @Autowired
    UserInfoService userInfoService;

    @PostMapping("/sendMail")
    public Result sendMail(String toMail) {
        int code= RandomUtil.randomInt(1000,9999);
        String nanoId = NanoId.randomNanoId();
        try {
            redisUtil.hset(RedisKey.Email.getName(),nanoId,code+" "+toMail,60);
            SimpleMailMessage message=new SimpleMailMessage();
            message.setFrom("2523273301@qq.com");
            message.setTo(toMail);
            message.setSubject("狗眼电影登录验证");
            message.setText(String.format("狗眼电影登录验证: 你当前的验证码是%s",code));
            javaMailSender.send(message);

        } catch (Exception e) {
            return Result.fail(e.getMessage());
        }
        return Result.succ("邮件已发送,请查看邮件!",nanoId);
    }


    @PostMapping("/validMail")
    public Result validMail(String code,String nid){
        String code1 = (String) redisUtil.hget(RedisKey.Email.getName(), nid);
        if(StrUtil.isEmpty(code1)){
            return Result.fail("验证码已失效,请重新发送");
        }
        String[] arr=code1.split(" ");
        if(!code.equals(arr[0])){
            return Result.fail("验证码错误,请重新发送");
        }

        // TODO: 2021/12/7  罗浩宇  新建一条用户数据 只要把邮箱存进去
        return Result.succ("邮箱注册成功!",null);
    }

    /**
     * 发送手机短信验证码
     * @param phone
     * @return
     */
    @PostMapping("/sendCaptcha")
    public Result getMsgCaptcha(String phone){
        /*获得一个四位数的随机验证码*/
        int code= RandomUtil.randomInt(1000,9999);
        String key=NanoId.randomNanoId();/*生成随机字符串作为键*/
        Map<String, Object> map = new HashMap<>();
        map.put("phone",phone);/*手机号*/
        map.put("status",1);/*发送状态 0：失败 1：成功*/
        map.put("code",code);/*验证码*/
        /*模版字符串*/
        map.put("template",String.format("【狗眼电影】 验证码：%s,用于验证你的手机号%s",code,phone));
        /*保存key*/
        map.put("key",key);
        try {
           /*发送成功*/
            if (Integer.parseInt(map.get("status").toString())==1) {
                /*将map集合存到redis中，等到下次校验*/
                redisUtil.hset(RedisKey.Phone.getName(), key,map,60);
            }
        } catch (NumberFormatException e) {
            Result.fail("验证码发送失败： "+e.getMessage());
        }
        return Result.succ("验证码发送成功",map);
    }

    /**
     * 验证手机短信验证码并注册用户
     * @param code
     * @param key
     * @param userInfo
     * @return
     */
    @PostMapping("/verifyCaptcha")
    public Result verifyCaptcha(String code,String key, String userInfo){
        try {
            /*将字符串转换为指定类*/
            UserInfo info = JSONUtil.toBean(userInfo, UserInfo.class);
            info.setUserCreateTime(new Date());
            info.setUserLoginTime(new Date());
            /*获取redis存取的数据*/
            Map<String,Object> map = (Map<String, Object>) redisUtil.hget(RedisKey.Phone.getName(), key);
            /*判断验证码是否过期*/
            if (StrUtil.isEmpty(map.get("code").toString())) {
                return Result.fail("验证码已失效,请重新发送");
            }
            /*验证用户电话是否与上次一致*/
            if (!map.get("phone").toString().equals(info.getUserPhone())){
                return Result.fail("电话号码与上次不一致，请重新获取验证码或者输入正确的手机号");
            }
            /*判断验证码是否正确*/
            if (!map.get("code").toString().equals(code)){
                return Result.fail("验证码错误，请重新输入验证码");
            }
            /*验证成功，保存数据添加至数据库*/
            boolean save = userInfoService.save(info);
            /*添加数据失败，信息填写错误或其他异常*/
            if(!save)Result.fail("注册失败");
        }catch (Exception e){
            return Result.fail("验证失败"+e.getMessage());
        }
        /*验证通过，数据添加成功*/
        return  Result.succ("注册成功",null);
    }

}
